3 R zor şeyler için kolay, kolay şeyler için zor

R Syntax Comparison::CHEAT SHEET

https://www.amelia.mn/Syntax-cheatsheet.pdf


4 R paketleri

4.1 Neden paketler var



https://blog.mitchelloharawild.com/blog/user-2018-feature-wall/



4.2 Paketleri nereden bulabiliriz

4.3 Kendi paket evrenini oluştur


4.4 R için yardım bulma

5 ?mean

6 ??efetch

7 help(merge)

8 example(merge)




- Vignette

![](figures/vignette.png)

---

- RDocumentation
https://www.rdocumentation.org

- R Package Documentation
https://rdrr.io/

- GitHub

- Stackoverflow

https://stackoverflow.com/

- Google uygun anahtar kelime



<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">How I use <a href="https://twitter.com/hashtag/rstats?src=hash&amp;ref_src=twsrc%5Etfw">#rstats</a> <br>h/t <a href="https://twitter.com/ThePracticalDev?ref_src=twsrc%5Etfw">@ThePracticalDev</a> <a href="https://t.co/erRnTG0Ujr">pic.twitter.com/erRnTG0Ujr</a></p>&mdash; Emily Bovee (@ebovee09) <a href="https://twitter.com/ebovee09/status/1028037594947485696?ref_src=twsrc%5Etfw">August 10, 2018</a></blockquote>


---


![](figures/Google-package-name.png)

---



![](figures/Google-start-with-R.png)

---

- Awesome Cheatsheet
https://github.com/detailyang/awesome-cheatsheet

http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf

https://www.rstudio.com/resources/cheatsheets/


- Awesome R

https://github.com/qinwf/awesome-R#readme

https://awesome-r.com/




- Twitter

https://twitter.com/hashtag/rstats?src=hash


- Reproducible Examples

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Got a question to ask on <a href="https://twitter.com/SlackHQ?ref_src=twsrc%5Etfw">@SlackHQ</a> or post on <a href="https://twitter.com/github?ref_src=twsrc%5Etfw">@github</a>? No time to read the long post on how to use reprex? Here is a 20-second gif for you to format your R codes nicely and for others to reproduce your problem. (An example from a talk given by <a href="https://twitter.com/JennyBryan?ref_src=twsrc%5Etfw">@JennyBryan</a>) <a href="https://twitter.com/hashtag/rstat?src=hash&amp;ref_src=twsrc%5Etfw">#rstat</a> <a href="https://t.co/gpuGXpFIsX">pic.twitter.com/gpuGXpFIsX</a></p>&mdash; ZhiYang (@zhiiiyang) <a href="https://twitter.com/zhiiiyang/status/1053006003711569920?ref_src=twsrc%5Etfw">October 18, 2018</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>





---

## R paket yükleme

install.packages(“tidyverse”, dependencies = TRUE) install.packages(“jmv”, dependencies = TRUE) install.packages(“questionr”, dependencies = TRUE) install.packages(“Rcmdr”, dependencies = TRUE) install.packages(“summarytools”)



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBpbnN0YWxsLnBhY2thZ2VzKFwidGlkeXZlcnNlXCIsIGRlcGVuZGVuY2llcyA9IFRSVUUpXG4jIGluc3RhbGwucGFja2FnZXMoXCJqbXZcIiwgZGVwZW5kZW5jaWVzID0gVFJVRSlcbiMgaW5zdGFsbC5wYWNrYWdlcyhcInF1ZXN0aW9uclwiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKVxuIyBpbnN0YWxsLnBhY2thZ2VzKFwiUmNtZHJcIiwgZGVwZW5kZW5jaWVzID0gVFJVRSlcbiMgaW5zdGFsbC5wYWNrYWdlcyhcInN1bW1hcnl0b29sc1wiKVxuYGBgIn0= -->

```r
# install.packages("tidyverse", dependencies = TRUE)
# install.packages("jmv", dependencies = TRUE)
# install.packages("questionr", dependencies = TRUE)
# install.packages("Rcmdr", dependencies = TRUE)
# install.packages("summarytools")
# require(tidyverse)
# require(jmv)
# require(questionr)
# library(summarytools)
# library(gganimate)

10 RStudio ile veri yükleme

https://support.rstudio.com/hc/en-us/articles/218611977-Importing-Data-with-RStudio


10.1 Excel

10.2 SPSS

10.3 csv


11 Veriyi görüntüleme

# library(nycflights13)
# summary(flights)
View(data)
data
head
tail
glimpse
str
skimr::skim()

12 Veriyi değiştirme

12.1 Veriyi kod ile değiştirelim

12.2 Veriyi eklentilerle değiştirme


12.3 RStudio aracılığıyla recode

questionr paketi kullanılacak


https://juba.github.io/questionr/articles/recoding_addins.html




13 Basit tanımlayıcı istatistikler

summary()
mean
median
min
max
sd
table()
library(readr)
irisdata <- read_csv("data/iris.csv")

jmv::descriptives(
    data = irisdata,
    vars = "Sepal.Length",
    splitBy = "Species",
    freq = TRUE,
    hist = TRUE,
    dens = TRUE,
    bar = TRUE,
    box = TRUE,
    violin = TRUE,
    dot = TRUE,
    mode = TRUE,
    sum = TRUE,
    sd = TRUE,
    variance = TRUE,
    range = TRUE,
    se = TRUE,
    skew = TRUE,
    kurt = TRUE,
    quart = TRUE,
    pcEqGr = TRUE)

13.2 skimr

library(skimr)
skim(df)

13.3 DataExplorer

library(DataExplorer)
DataExplorer::create_report(df)


13.4 Grafikler



descr(tobacco, style = 'rmarkdown')

print(descr(tobacco), method = 'render', table.classes = 'st-small')

dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)

print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')



14 Rcmdr

library(Rcmdr)

Rcmdr::Commander()
  • A Comparative Review of the R Commander GUI for R

http://r4stats.com/articles/software-reviews/r-commander/


16 Sonraki Konular

  • RStudio ile GitHub
  • Hipotez testleri
  • R Markdown ve R Notebook ile tekrarlanabilir rapor

17 Diğer kodlar


18 Geri Bildirim




  1. Bu bir derlemedir, mümkün mertebe alıntılara referans vermeye çalıştım.↩︎

LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmRhdGU6ICJge3IgIyAgZm9ybWF0KFN5cy5EYXRlKCkpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6Om1hdGVyaWFsOgogICAgaGlnaGxpZ2h0OiBrYXRlCiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDogCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKCgoKCmBgYHtyICwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocm1kZm9ybWF0cykKCiMjIEdsb2JhbCBvcHRpb25zCm9wdGlvbnMobWF4LnByaW50PSI3NSIpCm9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwKICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLAogICAgICAgICAgICAgICB0aWR5PVRSVUUsCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpCm9wdHNfa25pdCRzZXQod2lkdGg9NzUpCmBgYAoKCjwhLS0gT3BlbiBhbGwgbGlua3MgaW4gbmV3IHRhYi0tPiAgCjwhLS0gPGJhc2UgdGFyZ2V0PSJfYmxhbmsiLz4gICAgLS0+CgoKPCEtLSBHbyB0byB3d3cuYWRkdGhpcy5jb20vZGFzaGJvYXJkIHRvIGN1c3RvbWl6ZSB5b3VyIHRvb2xzIC0tPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3M3LmFkZHRoaXMuY29tL2pzLzMwMC9hZGR0aGlzX3dpZGdldC5qcyNwdWJpZD1yYS01YmMzNjkwMGE0MDUwOTBiIj4gIAo8L3NjcmlwdD4gCgojIFIgaGFra8SxbmRhCgoKWyFbXShodHRwOi8vcmVzLmNsb3VkaW5hcnkuY29tL2R5ZDkxMWttaC9pbWFnZS91cGxvYWQvZl9hdXRvLHFfYXV0bzpiZXN0L3YxNTMwMTEzMDc3L0ltYWdlXzJfdmZ5NDhiLnBuZyldKGh0dHBzOi8vd3d3LmRhdGFjYW1wLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2RhdGEtc2NpZW5jZS1waXRmYWxscykKCgotIFIgZ2VuZXJhdGlvbgoKaHR0cHM6Ly9yc3Mub25saW5lbGlicmFyeS53aWxleS5jb20vZG9pLzEwLjExMTEvai4xNzQwLTk3MTMuMjAxOC4wMTE2OS54CgoKIyBSIHnDvGtsZW1lCgpodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WGNCTEVWa25xdlkKClshW1doYXQgaXMgUj9dKGh0dHA6Ly9pbWcueW91dHViZS5jb20vdmkvWGNCTEVWa25xdlkvMC5qcGcpXShodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WGNCTEVWa25xdlkpCgoKIyMgUi1wcm9qZWN0CgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy8KCi0tLQoKWyFbXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9pbWcvZW5naW5lLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM2KQoKLS0tCgojIyBSU3R1ZGlvCgpodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8KCmh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvCgpodHRwczovL21vZGVybmRpdmUuY29tLzItZ2V0dGluZy1zdGFydGVkLmh0bWwKCi0tLQoKWyFbXShodHRwOi8vd3d3LXVzZXJzLnlvcmsuYWMudWsvfmVyMTMvUlN0dWRpbyUyMEFuYXRvbXkuc3ZnKV0oaHR0cHM6Ly9idXp6cmJlZWxpbmUuYmxvZy8yMDE4LzA3LzA0L3JzdHVkaW8tYW5hdG9teS8pCgoKCi0tLQoKIyMjIFJTdHVkaW8gZWtsZW50aWxlcmkKCi0gRGlzY292ZXIgYW5kIGluc3RhbGwgdXNlZnVsIFJTdHVkaW8gYWRkaW5zCgpodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYWRkaW5zbGlzdC9SRUFETUUuaHRtbAoKaHR0cHM6Ly9yc3R1ZGlvLmdpdGh1Yi5pby9yc3R1ZGlvYWRkaW5zLwoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIGVjaG89VFJVRX0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInJzdHVkaW8vYWRkaW5leGFtcGxlcyIsIHR5cGUgPSAic291cmNlIikKYGBgCgoKLS0tCgojIyBYMTEKCmh0dHBzOi8vd3d3LnhxdWFydHoub3JnLwoKLS0tCgojIyBKYXZhIE9TCgpodHRwczovL3N1cHBvcnQuYXBwbGUuY29tL2tiL2RsMTU3MgoKLS0tCgoKIyBSIHpvciDFn2V5bGVyIGnDp2luIGtvbGF5LCBrb2xheSDFn2V5bGVyIGnDp2luIHpvcgoKCi0gW1IgbWFrZXMgZWFzeSB0aGluZ3MgaGFyZCwgYW5kIGhhcmQgdGhpbmdzIGVhc3ldKGh0dHA6Ly9yNHN0YXRzLmNvbS9hcnRpY2xlcy93aHktci1pcy1oYXJkLXRvLWxlYXJuLykKCgotIEF5bsSxIMWfZXlpIMOnb2sgZmF6bGEgxZ9la2lsZGUgeWFwbWFrIG3DvG1rw7xuCgpSIFN5bnRheCBDb21wYXJpc29uOjpDSEVBVCBTSEVFVAoKaHR0cHM6Ly93d3cuYW1lbGlhLm1uL1N5bnRheC1jaGVhdHNoZWV0LnBkZgoKCgotLS0KCgojIFIgcGFrZXRsZXJpCgoKIyMgTmVkZW4gcGFrZXRsZXIgdmFyCgpbIVtdKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL2ltZy9hcHBzdG9yZS5wbmcpXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9zbGlkZV9kZWNrLmh0bWwjNykKCi0tLQoKPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkkgbG92ZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gY29tbXVuaXR5Ljxicj5Tb21lb25lIGlzIGxpa2UsICZxdW90O29oIGhleSBwZWVwcywgSSBzYXcgYSBiaWcgbmVlZCBmb3IgdGhpcyBtdW5kYW5lIGJ1dCBkaWZmaWN1bHQgdGFzayB0aGF0IEkgaW5mcmVxdWVudGx5IGRvLCBzbyBJIGNyZWF0ZWQgYSBwYWNrYWdlIHRoYXQgd2lsbCBsaXRlcmFsbHkgc2NyYXBlIHRoZSBsYXN0IGJpdHMgb2YgcGVhbnV0IGJ1dHRlciBvdXQgb2YgdGhlIGphciBmb3IgeW91LiBJdCYjMzk7cyBjYWxsZWQgcGJwbHlyLiZxdW90Ozxicj5XaGF0IGEgdHJpYmUuPC9wPiZtZGFzaDsgRnJhbmsgRWxhdnNreSDhtLDhtYPhtZfhtYMg4bWC4bam4ba74bWDyrPhtYggKEBGcmFua2x5X0RhdGEpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vRnJhbmtseV9EYXRhL3N0YXR1cy8xMDE0MTg5MDk1Mjk0MjkxOTY4P3JlZl9zcmM9dHdzcmMlNUV0ZnciPkp1bHkgMywgMjAxODwvYT48L2Jsb2NrcXVvdGU+CgotLS0KCgoKaHR0cHM6Ly9ibG9nLm1pdGNoZWxsb2hhcmF3aWxkLmNvbS9ibG9nL3VzZXItMjAxOC1mZWF0dXJlLXdhbGwvCgotLS0KCiFbXShodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvMjAxOC0wNy0xMS11c2VyLTIwMTgtZmVhdHVyZS13YWxsX2ZpbGVzL2ZpbmFsLmpwZykKCi0tLQoKIyMgUGFrZXRsZXJpIG5lcmVkZW4gYnVsYWJpbGlyaXoKCi0gQXZhaWxhYmxlIENSQU4gUGFja2FnZXMgQnkgTmFtZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hdmFpbGFibGVfcGFja2FnZXNfYnlfbmFtZS5odG1sCgotIEJpb2NvbmR1Y3RvciAgCmh0dHBzOi8vd3d3LmJpb2NvbmR1Y3Rvci5vcmcKCi0gUmVjb21tZW5kUiAgCmh0dHA6Ly9yZWNvbW1lbmRyLmluZm8vCgotIHBrZ3NlYXJjaCAgCkNSQU4gcGFja2FnZSBzZWFyY2ggIApodHRwczovL2dpdGh1Yi5jb20vbWV0YWNyYW4vcGtnc2VhcmNoCgotIEF3ZXNvbWUgUiAgCmh0dHBzOi8vYXdlc29tZS1yLmNvbS8gIAoKCiMjIEtlbmRpIHBha2V0IGV2cmVuaW5pIG9sdcWfdHVyCgotIHBrZ3ZlcnNlOiBCdWlsZCBhIE1ldGEtUGFja2FnZSBVbml2ZXJzZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9wa2d2ZXJzZS9pbmRleC5odG1sCgoKCi0tLQoKIyMgUiBpw6dpbiB5YXJkxLFtIGJ1bG1hCgoKCiMgP21lYW4KIyA/P2VmZXRjaAojIGhlbHAobWVyZ2UpCiMgZXhhbXBsZShtZXJnZSkKYGBgCgoKCi0gVmlnbmV0dGUKCiFbXShmaWd1cmVzL3ZpZ25ldHRlLnBuZykKCi0tLQoKLSBSRG9jdW1lbnRhdGlvbgpodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcKCi0gUiBQYWNrYWdlIERvY3VtZW50YXRpb24KaHR0cHM6Ly9yZHJyLmlvLwoKLSBHaXRIdWIKCi0gU3RhY2tvdmVyZmxvdwoKaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS8KCi0gR29vZ2xlIHV5Z3VuIGFuYWh0YXIga2VsaW1lCgoKCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD48YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5Ib3cgSSB1c2UgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gPGJyPmgvdCA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1RoZVByYWN0aWNhbERldj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGhlUHJhY3RpY2FsRGV2PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZXJSblRHMFVqciI+cGljLnR3aXR0ZXIuY29tL2VyUm5URzBVanI8L2E+PC9wPiZtZGFzaDsgRW1pbHkgQm92ZWUgKEBlYm92ZWUwOSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9lYm92ZWUwOS9zdGF0dXMvMTAyODAzNzU5NDk0NzQ4NTY5Nj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5BdWd1c3QgMTAsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgoKCi0tLQoKCiFbXShmaWd1cmVzL0dvb2dsZS1wYWNrYWdlLW5hbWUucG5nKQoKLS0tCgoKCiFbXShmaWd1cmVzL0dvb2dsZS1zdGFydC13aXRoLVIucG5nKQoKLS0tCgotIEF3ZXNvbWUgQ2hlYXRzaGVldApodHRwczovL2dpdGh1Yi5jb20vZGV0YWlseWFuZy9hd2Vzb21lLWNoZWF0c2hlZXQKCmh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvQmFnZ290dC1yZWZjYXJkLXYyLnBkZgoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLwoKCi0gQXdlc29tZSBSCgpodHRwczovL2dpdGh1Yi5jb20vcWlud2YvYXdlc29tZS1SI3JlYWRtZQoKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLwoKCgoKLSBUd2l0dGVyCgpodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoCgoKLSBSZXByb2R1Y2libGUgRXhhbXBsZXMKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkdvdCBhIHF1ZXN0aW9uIHRvIGFzayBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1NsYWNrSFE/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFNsYWNrSFE8L2E+IG9yIHBvc3Qgb24gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9naXRodWI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QGdpdGh1YjwvYT4/IE5vIHRpbWUgdG8gcmVhZCB0aGUgbG9uZyBwb3N0IG9uIGhvdyB0byB1c2UgcmVwcmV4PyBIZXJlIGlzIGEgMjAtc2Vjb25kIGdpZiBmb3IgeW91IHRvIGZvcm1hdCB5b3VyIFIgY29kZXMgbmljZWx5IGFuZCBmb3Igb3RoZXJzIHRvIHJlcHJvZHVjZSB5b3VyIHByb2JsZW0uIChBbiBleGFtcGxlIGZyb20gYSB0YWxrIGdpdmVuIGJ5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vSmVubnlCcnlhbj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5ASmVubnlCcnlhbjwvYT4pIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZ3B1R1hwRklzWCI+cGljLnR3aXR0ZXIuY29tL2dwdUdYcEZJc1g8L2E+PC9wPiZtZGFzaDsgWmhpWWFuZyAoQHpoaWlpeWFuZykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS96aGlpaXlhbmcvc3RhdHVzLzEwNTMwMDYwMDM3MTE1Njk5MjA/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAxOCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCgoKCi0tLQoKIyMgUiBwYWtldCB5w7xrbGVtZQoKYGBgCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoImptdiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoIlJjbWRyIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKYGBgCgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoImptdiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygicXVlc3Rpb25yIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJSY21kciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKYGBgCgoKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9IFRSVUUsIGluY2x1ZGUgPSBUUlVFfQojIHJlcXVpcmUodGlkeXZlcnNlKQojIHJlcXVpcmUoam12KQojIHJlcXVpcmUocXVlc3Rpb25yKQojIGxpYnJhcnkoc3VtbWFyeXRvb2xzKQojIGxpYnJhcnkoZ2dhbmltYXRlKQpgYGAKCi0tLQoKIyBSIHN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXJtYQoKaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDUyNjIwNy1Vc2luZy1Qcm9qZWN0cwoKIVtdKGh0dHA6Ly93d3cucnN0dWRpby5jb20vaW1hZ2VzL2RvY3MvcHJvamVjdHNfbmV3LnBuZykKCi0tLQoKIyBSU3R1ZGlvIGlsZSB2ZXJpIHnDvGtsZW1lCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjE4NjExOTc3LUltcG9ydGluZy1EYXRhLXdpdGgtUlN0dWRpbwoKIVtdKGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlX2F0dGFjaG1lbnRzLzIwNjI3NzYxOC9kYXRhLWltcG9ydC1vdmVydmlldy5naWYpCgotLS0KCiMjIEV4Y2VsCgojIyBTUFNTCgojIyBjc3YKCgotLS0KCiMgVmVyaXlpIGfDtnLDvG50w7xsZW1lCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+U3ByZWFkc2hlZXQgdXNlcnMgdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT46ICB3aGVyZSYjMzk7cyB0aGUgZGF0YT88YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiB1c2VycyB1c2luZyBzcHJlYWRzaGVldHM6ICB3aGVyZSYjMzk7cyB0aGUgY29kZT88L3A+Jm1kYXNoOyBMZW9uYXJkIEtpZWZlciAoQGxlbmtpZWZlcikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9sZW5raWVmZXIvc3RhdHVzLzEwMTU1ODc0NzU1ODA5NTY2NzI/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSA3LCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgoKYGBge3IsIHJlc3VsdHM9Im1hcmt1cCJ9CiMgbGlicmFyeShueWNmbGlnaHRzMTMpCiMgc3VtbWFyeShmbGlnaHRzKQpgYGAKCgoKYGBgClZpZXcoZGF0YSkKYGBgCgoKYGBgCmRhdGEKYGBgCgoKYGBgCmhlYWQKYGBgCgoKYGBgCnRhaWwKYGBgCgoKYGBgCmdsaW1wc2UKYGBgCgoKYGBgCnN0cgpgYGAKCgpgYGAKc2tpbXI6OnNraW0oKQpgYGAKCi0tLQoKCiMgVmVyaXlpIGRlxJ9pxZ90aXJtZQoKIyMgVmVyaXlpIGtvZCBpbGUgZGXEn2nFn3RpcmVsaW0KCiMjIFZlcml5aSBla2xlbnRpbGVybGUgZGXEn2nFn3Rpcm1lCgohW10oZmlndXJlcy9jaGFuZ2VfZGF0YS5wbmcpCgoKLS0tCgoKIyMgUlN0dWRpbyBhcmFjxLFsxLHEn8SxeWxhIHJlY29kZQoKKnF1ZXN0aW9uciogcGFrZXRpIGt1bGxhbsSxbGFjYWsKCiFbXShmaWd1cmVzL2xldmVsX3JlY29kZS5wbmcpCgoKLS0tCgoKCmh0dHBzOi8vanViYS5naXRodWIuaW8vcXVlc3Rpb25yL2FydGljbGVzL3JlY29kaW5nX2FkZGlucy5odG1sCgoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMS5wbmcpCgoKLS0tCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18yLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzMucG5nKQoKCi0tLQoKIyBCYXNpdCB0YW7EsW1sYXnEsWPEsSBpc3RhdGlzdGlrbGVyCgpgYGAKc3VtbWFyeSgpCmBgYAoKYGBgCm1lYW4KYGBgCgpgYGAKbWVkaWFuCmBgYAoKYGBgCm1pbgpgYGAKCmBgYAptYXgKYGBgCgpgYGAKc2QKYGBgCgpgYGAKdGFibGUoKQpgYGAKCgpgYGB7ciwgZWNobz1UUlVFLCBpbmNsdWRlID0gVFJVRX0KbGlicmFyeShyZWFkcikKaXJpc2RhdGEgPC0gcmVhZF9jc3YoImRhdGEvaXJpcy5jc3YiKQoKam12OjpkZXNjcmlwdGl2ZXMoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB2YXJzID0gIlNlcGFsLkxlbmd0aCIsCiAgICBzcGxpdEJ5ID0gIlNwZWNpZXMiLAogICAgZnJlcSA9IFRSVUUsCiAgICBoaXN0ID0gVFJVRSwKICAgIGRlbnMgPSBUUlVFLAogICAgYmFyID0gVFJVRSwKICAgIGJveCA9IFRSVUUsCiAgICB2aW9saW4gPSBUUlVFLAogICAgZG90ID0gVFJVRSwKICAgIG1vZGUgPSBUUlVFLAogICAgc3VtID0gVFJVRSwKICAgIHNkID0gVFJVRSwKICAgIHZhcmlhbmNlID0gVFJVRSwKICAgIHJhbmdlID0gVFJVRSwKICAgIHNlID0gVFJVRSwKICAgIHNrZXcgPSBUUlVFLAogICAga3VydCA9IFRSVUUsCiAgICBxdWFydCA9IFRSVUUsCiAgICBwY0VxR3IgPSBUUlVFKQpgYGAKCi0tLQoKYGBge3IsIGVjaG89VFJVRSwgaW5jbHVkZT1GQUxTRX0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzY2F0ciIpCgpzY2F0cjo6c2NhdCgKICAgIGRhdGEgPSBpcmlzZGF0YSwKICAgIHggPSAiU2VwYWwuTGVuZ3RoIiwKICAgIHkgPSAiU2VwYWwuV2lkdGgiLAogICAgZ3JvdXAgPSAiU3BlY2llcyIsCiAgICBtYXJnID0gImRlbnMiLAogICAgbGluZSA9ICJsaW5lYXIiLAogICAgc2UgPSBUUlVFKQoKYGBgCgojIyBzdW1tYXJ5dG9vbHMKCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdW1tYXJ5dG9vbHMvdmlnbmV0dGVzL0ludHJvZHVjdGlvbi5odG1sCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KbGlicmFyeShzdW1tYXJ5dG9vbHMpCnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0UsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHJlcG9ydC5uYXMgPSBGQUxTRSwgc3R5bGUgPSAicm1hcmtkb3duIiwgb21pdC5oZWFkaW5ncyA9IFRSVUUpCmBgYAoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aXRoKHRvYmFjY28sIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkKSwgbWV0aG9kID0gJ3JlbmRlcicpKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2l0aCh0b2JhY2NvLCAKICAgICBwcmludChjdGFibGUoc21va2VyLCBkaXNlYXNlZCwgcHJvcCA9ICduJywgdG90YWxzID0gRkFMU0UpLCAKICAgICAgICAgICBvbWl0LmhlYWRpbmdzID0gVFJVRSwgbWV0aG9kID0gInJlbmRlciIpKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9RkFMU0UsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnN1bW1hcnl0b29sczo6ZGVzY3IoaXJpcywgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkZXNjcihpcmlzLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSwgdHJhbnNwb3NlID0gVFJVRSwgCiAgICAgIG9taXQuaGVhZGluZ3MgPSBUUlVFLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgoKYGBge3IsIGluY2x1ZGU9RkFMU0UsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgdmlldyhkZlN1bW1hcnkoaXJpcykpCgpgYGAKCgohW10oZmlndXJlcy9kZnN1bW1hcnkucG5nKQoKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGZTdW1tYXJ5KHRvYmFjY28sIHBsYWluLmFzY2lpID0gRkFMU0UsIHN0eWxlID0gImdyaWQiKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KCiMgRmlyc3Qgc2F2ZSB0aGUgcmVzdWx0cwoKaXJpc19zdGF0c19ieV9zcGVjaWVzIDwtIGJ5KGRhdGEgPSBpcmlzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElDRVMgPSBpcmlzJFNwZWNpZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gZGVzY3IsIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSA9IFRSVUUpCgojIFRoZW4gdXNlIHZpZXcoKSwgbGlrZSBzbzoKCnZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzLCBtZXRob2QgPSAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyB2aWV3KGlyaXNfc3RhdHNfYnlfc3BlY2llcykKYGBgCgohW10oZmlndXJlcy9EZXNjcmlwdGl2ZVN0YXRpc3RpY3MucG5nKQoKLS0tCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGF0YSh0b2JhY2NvKSAjIHRvYmFjY28gaXMgYW4gZXhhbXBsZSBkYXRhZnJhbWUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UKQk1JX2J5X2FnZSA8LSB3aXRoKHRvYmFjY28sIAogICAgICAgICAgICAgICAgICAgYnkoQk1JLCBhZ2UuZ3IsIGRlc2NyLCAKICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpKSkKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPUZBTFNFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpCTUlfYnlfYWdlIDwtIHdpdGgodG9iYWNjbywgCiAgICAgICAgICAgICAgICAgICBieShCTUksIGFnZS5nciwgZGVzY3IsICB0cmFuc3Bvc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IikpKQoKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIiwgb21pdC5oZWFkaW5ncyA9IFRSVUUpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KdG9iYWNjb19zdWJzZXQgPC0gdG9iYWNjb1sgLGMoImdlbmRlciIsICJhZ2UuZ3IiLCAic21va2VyIildCmZyZXFfdGFibGVzIDwtIGxhcHBseSh0b2JhY2NvX3N1YnNldCwgZnJlcSkKCiMgdmlldyhmcmVxX3RhYmxlcywgZm9vdG5vdGUgPSBOQSwgZmlsZSA9ICdmcmVxLXRhYmxlcy5odG1sJykKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPUZBTFNFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aGF0LmlzKGlyaXMpCmBgYAoKLS0tCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBlY2hvPVRSVUV9CmZyZXEodG9iYWNjbyRnZW5kZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpCmBgYAoKLS0tCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBlY2hvPVRSVUV9CnByaW50KGZyZXEodG9iYWNjbyRnZW5kZXIpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgotLS0KCiMjIHNraW1yCgpgYGAKbGlicmFyeShza2ltcikKc2tpbShkZikKYGBgCgotLS0KCiMjIERhdGFFeHBsb3JlcgoKYGBgCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQpEYXRhRXhwbG9yZXI6OmNyZWF0ZV9yZXBvcnQoZGYpCmBgYAoKClshW10oaHR0cHM6Ly9zdGF0aWMxLnNxdWFyZXNwYWNlLmNvbS9zdGF0aWMvNThlZWY4ODQ2YTQ5NjNlNDI5Njg3YTRkL3QvNWJkZmMyZmI0ZDdhOWMwNGVlNTBiN2FhLzE1NDEzOTExNjA3MDIvZGF0YUV4cGxvcmVyR2lmTGcuZ2lmP2Zvcm1hdD0xNTAwdyldKGh0dHBzOi8vd3d3LmxpdHRsZW1pc3NkYXRhLmNvbS9ibG9nL3NpbXBsZS1lZGEpCgoKCi0tLQoKIyMgR3JhZmlrbGVyCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBlY2hvPVRSVUV9CiMgbGlicmFyeShnZ3Bsb3QyKQojIGxpYnJhcnkobW9zYWljKQojIG1QbG90KGlyaXNkYXRhKQpgYGAKCi0tLQoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgZWNobz1UUlVFfQpjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyLCBzdHlsZSA9ICdybWFya2Rvd24nKQpgYGAKCi0tLQoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgZWNobz1UUlVFfQpwcmludChjdGFibGUodG9iYWNjbyRnZW5kZXIsIHRvYmFjY28kc21va2VyKSwgbWV0aG9kID0gJ3JlbmRlcicpCmBgYAoKYGBgCmRlc2NyKHRvYmFjY28sIHN0eWxlID0gJ3JtYXJrZG93bicpCgpwcmludChkZXNjcih0b2JhY2NvKSwgbWV0aG9kID0gJ3JlbmRlcicsIHRhYmxlLmNsYXNzZXMgPSAnc3Qtc21hbGwnKQoKZGZTdW1tYXJ5KHRvYmFjY28sIHN0eWxlID0gJ2dyaWQnLCBwbGFpbi5hc2NpaSA9IEZBTFNFKQoKcHJpbnQoZGZTdW1tYXJ5KHRvYmFjY28sIGdyYXBoLm1hZ25pZiA9IDAuNzUpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgoKLS0tCgoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkhlcmUsIGJ1aWxkaW5nIHVwIGEgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2dncGxvdDI/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNnZ3Bsb3QyPC9hPiBhcyBzbG93bHkgYXMgcG9zc2libGUsIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+LiAgSW5jcmVtZW50YWwgYWRqdXN0bWVudHMuICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzdGVhY2hpbmdpZGVhcz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0c3RlYWNoaW5naWRlYXM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9uVXVsUWw4YlBoIj5waWMudHdpdHRlci5jb20vblV1bFFsOGJQaDwvYT48L3A+Jm1kYXNoOyBHaW5hIFJleW5vbGRzIChARXZhTWFlUmV5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0V2YU1hZVJleS9zdGF0dXMvMTAyOTEwNDY1Njc2MzU3MjIyNj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5BdWd1c3QgMTMsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgotLS0KCgpbIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kcmVhbVJzL2VzcXVpc3NlL21hc3Rlci9tYW4vZmlndXJlcy9lc3F1aXNzZS5naWYpXShodHRwczovL2dpdGh1Yi5jb20vZHJlYW1Scy9lc3F1aXNzZSkKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5EcmVhbWluZyBvZiBhIGZhbmN5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9Sc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNSc3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9nZ3Bsb3Q/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNnZ3Bsb3Q8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9kYXRhdml6P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZGF0YXZpejwvYT4gYnV0IHN0aWxsIHNjYXJlZCBvZiB0eXBpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2NvZGU/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNjb2RlPC9hPj8gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fcHZpY3RvcnI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QF9wdmljdG9ycjwvYT4gZXNxdWlzc2UgcGFja2FnZSBoYXMgeW91IGNvdmVyZWQgPGEgaHJlZj0iaHR0cHM6Ly90LmNvLzF2SURYY1ZBQUYiPmh0dHBzOi8vdC5jby8xdklEWGNWQUFGPC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vUmxUa3B0bnJOdiI+cGljLnR3aXR0ZXIuY29tL1JsVGtwdG5yTnY8L2E+PC9wPiZtZGFzaDsgUmFkb3NsYXcgUGFuY3phayAoQFJQYW5jemFrKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1JQYW5jemFrL3N0YXR1cy8xMDQ3MDE5NTg4NjU4MDQwODMyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPk9jdG9iZXIgMiwgMjAxODwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgoKCgoKCgoKCi0tLQoKIyBSY21kcgoKYGBgCmxpYnJhcnkoUmNtZHIpCgpSY21kcjo6Q29tbWFuZGVyKCkKCmBgYAoKCi0gQSBDb21wYXJhdGl2ZSBSZXZpZXcgb2YgdGhlIFIgQ29tbWFuZGVyIEdVSSBmb3IgUgoKaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3NvZnR3YXJlLXJldmlld3Mvci1jb21tYW5kZXIvCgoKLS0tCgojIGphbW92aQoKaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy8KCiFbIVtdKGh0dHBzOi8vd3d3LmphbW92aS5vcmcvYXNzZXRzL21haW4tc2NyZWVuc2hvdC5wbmcpXShodHRwczovL3d3dy5qYW1vdmkub3JnLykKCgpodHRwczovL2Jsb2cuamFtb3ZpLm9yZy8yMDE4LzA3LzMwL3JqLmh0bWwKCiFbIVtdKGh0dHBzOi8vYmxvZy5qYW1vdmkub3JnL2Fzc2V0cy9pbWFnZXMvcmoucG5nKV0oaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvMjAxOC8wNy8zMC9yai5odG1sKQoKLS0tCgojIFNvbnJha2kgS29udWxhcgoKLSBSU3R1ZGlvIGlsZSBHaXRIdWIKLSBIaXBvdGV6IHRlc3RsZXJpCi0gUiBNYXJrZG93biB2ZSBSIE5vdGVib29rIGlsZSB0ZWtyYXJsYW5hYmlsaXIgcmFwb3IKCgotLS0KCiMgRGnEn2VyIGtvZGxhcgoKLSBEacSfZXIga29kbGFyIGnDp2luIGJha8SxbsSxejogW2h0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9dKGh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby8pCgoKLS0tCgojIEdlcmkgQmlsZGlyaW0KCi0gR2VyaSBiaWxkaXJpbSBpw6dpbiB0xLFrbGF5xLFuxLF6OiBfW0dlcmkgYmlsZGlyaW0gZm9ybXVdKGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzKV8KCgotLS0KCjxzY3JpcHQgaWQ9ImRzcS1jb3VudC1zY3IiIHNyYz0iLy9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vY291bnQuanMiIGFzeW5jPjwvc2NyaXB0PgoKPGRpdiBpZD0iZGlzcXVzX3RocmVhZCI+PC9kaXY+CjxzY3JpcHQ+CgovKioKKiAgUkVDT01NRU5ERUQgQ09ORklHVVJBVElPTiBWQVJJQUJMRVM6IEVESVQgQU5EIFVOQ09NTUVOVCBUSEUgU0VDVElPTiBCRUxPVyBUTyBJTlNFUlQgRFlOQU1JQyBWQUxVRVMgRlJPTSBZT1VSIFBMQVRGT1JNIE9SIENNUy4KKiAgTEVBUk4gV0hZIERFRklOSU5HIFRIRVNFIFZBUklBQkxFUyBJUyBJTVBPUlRBTlQ6IGh0dHBzOi8vZGlzcXVzLmNvbS9hZG1pbi91bml2ZXJzYWxjb2RlLyNjb25maWd1cmF0aW9uLXZhcmlhYmxlcyovCi8qCnZhciBkaXNxdXNfY29uZmlnID0gZnVuY3Rpb24gKCkgewp0aGlzLnBhZ2UudXJsID0gUEFHRV9VUkw7ICAvLyBSZXBsYWNlIFBBR0VfVVJMIHdpdGggeW91ciBwYWdlJ3MgY2Fub25pY2FsIFVSTCB2YXJpYWJsZQp0aGlzLnBhZ2UuaWRlbnRpZmllciA9IFBBR0VfSURFTlRJRklFUjsgLy8gUmVwbGFjZSBQQUdFX0lERU5USUZJRVIgd2l0aCB5b3VyIHBhZ2UncyB1bmlxdWUgaWRlbnRpZmllciB2YXJpYWJsZQp9OwoqLwooZnVuY3Rpb24oKSB7IC8vIERPTidUIEVESVQgQkVMT1cgVEhJUyBMSU5FCnZhciBkID0gZG9jdW1lbnQsIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwpzLnNyYyA9ICdodHRwczovL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9lbWJlZC5qcyc7CnMuc2V0QXR0cmlidXRlKCdkYXRhLXRpbWVzdGFtcCcsICtuZXcgRGF0ZSgpKTsKKGQuaGVhZCB8fCBkLmJvZHkpLmFwcGVuZENoaWxkKHMpOwp9KSgpOwo8L3NjcmlwdD4KPG5vc2NyaXB0PlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCB0byB2aWV3IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc3F1cy5jb20vP3JlZl9ub3NjcmlwdCI+Y29tbWVudHMgcG93ZXJlZCBieSBEaXNxdXMuPC9hPjwvbm9zY3JpcHQ+CgotLS0KCgoKCgo=